#include <stdio.h>

int max(int a,int b) {
    return a>b ? a : b;
}

int main() {
	int n,m;
	scanf("%d %d",&n,&m);
	int weight[n],value[n];
	for(int i=0;i<n;i++) {
		scanf("%d %d",&weight[i],&value[i]);
	}
	int dp[n][m+1];
	/* 初始化dp */
	for(int j=0;j<=m;j++) {
		if (j<weight[0]) dp[0][j]=0;
		else dp[0][j]=dp[0][j-weight[0]]+value[0];
	}
	/* 状态转移方程 */
	for(int i=1;i<n;i++) {
		for(int j=0;j<=m;j++) {
			if (j<weight[i]) dp[i][j] = dp[i-1][j];  //装不下
            else dp[i][j]=max(dp[i-1][j],dp[i][j-weight[i]]+value[i]);
		}
	}
	printf("%d\n",dp[n-1][m]);
	return 0;
}
/*
	int dp[m+1];
	memset(dp,0,sizeof(dp));
    for(int i=0;i<n;i++) {
        for(int j=weight[i];j<=m;j++) {
            dp[j]=max(dp[j],dp[j-weight[i]]+value[i]);
        }
    }
    printf("%d\n",dp[m]);
*/